package com.m1.tzolkin.model.util.zone;

import java.io.Serializable;
import java.util.Collection;

import com.m1.tzolkin.model.exceptions.StepMoveException;

/**
 * Un gestionnaire de zones parcourables.
 * Celui-ci g�re plusieurs zones et garantit leur synchronisation.
 * 
 * @cons <pre>
 * $DESC$
 *     Un gestionnaire de zones avec les zones de z.
 * $ARGS$
 *     Z[] z
 * $PRE$
 *     z != null
 * $POST$
 *     getZones().equals(z) </pre>
 *
 */
public interface IStepsZonesManager<Z, P> extends Serializable {
	
	// REQUETES
	
	/**
	 * Retourne les zones que g�re ce gestionnaire.
	 */
	Collection<Z> getZones();
	
	/**
	 * Retourne la position de l'�l�ment p dans la zone z.
	 * @pre <pre>
	 *     z != null && p != null
	 *     getKeys().contains(p) </pre>
	 */
	int getPosition(Z z, P p);
	
	/**
	 * Retourne true si le joueur p peut monter dans la zone z.
	 */
	boolean canUp(Z z, P p);
	
	/**
	 * Retourne true si le joueur p peut descendre dans la zone z.
	 */
	boolean canDown(Z z, P p);
	
	// COMMANDES
	
	/**
	 * Ajoute la cl� p.
	 * @pre <pre>
	 *     p != null && !getKeys().contains(p). </pre>
	 */
	void addKey(P p);
	
	/**
	 * Ajoute la cl� p � la marche i dans chaque zone.
	 * @pre <pre>
	 *     p != null && !getKeys().contains(p)
	 *     i >= 0
	 *     pour chaque z : getZones()
	 *         i < z.getStepsNb() </pre>
	 */
	void addKey(P p, int i);
	
	/**
	 * Monte la cl� p dans le temple t si c'est possible.
	 * @pre <pre>
	 *     t != null
	 *     p != null
	 *     getKeys().contains(p) </pre>
	 */
	void up(Z z, P p) throws StepMoveException;
	
	/**
	 * Descend la cl� p d'une marche dans le temple t si c'est possible.
	 * @pre <pre>
	 *     t != null
	 *     p != null
	 *     getKeys().contains(p) </pre>
	 */
	void down(Z z, P p) throws StepMoveException;
	
}
